home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / townsmsx / scc2sc8.c < prev    next >
Text File  |  1994-06-01  |  11KB  |  507 lines

  1. /*********************************************************************
  2.  
  3.            MSX SCREEN12 BSAVE FILE -> MSX SCREEN8 BSAVE FILE
  4.                 by ちにゃと    (NIFTY-Serve ID:GFH01000)
  5.  
  6.                     1993/12/07       Ver 2.1 L20            
  7.  
  8. ********************************************************************/
  9.  
  10.                      
  11. #include <io.h>
  12. #include <fcntl.h>
  13. #include <stat.h>
  14. #include <memory.h>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include <conio.h>
  19. #include <dos.h>
  20. #include <mos.h>
  21. #include <math.h>
  22. #include <stat.h>
  23.  
  24.  
  25. /* T-BIOS C ライブラリ ヘッダー */
  26. #include <fmcfrb.h>
  27. char fname[256];
  28. char filepath[256];
  29. char sccext[10];
  30. char srsext[10];
  31. char scchead[10];
  32. char sccdata[256*64][4];
  33. char sc8data[256*64][4];
  34. char wildfname[100][256];
  35. unsigned char r[4];
  36. unsigned char g[4];
  37. unsigned char b[4];
  38. int bb[4];
  39. unsigned char y[4];
  40. unsigned char k,kj;
  41. int rshift,gshift,bshift;
  42. int sccsize;
  43. int i,j,wildcard;
  44. int w_ret;
  45. int mode;
  46. int fileno;
  47. int namelen;
  48. int flong;
  49. int findflag;
  50. int wildct;
  51. int sc8tmp;
  52. static struct find_t wildfbuf;
  53. static unsigned long ret,pan;
  54. int x;
  55. /************************************************************
  56. 【オプション解析】
  57.  
  58.         概要    オプションパラメ-タの解析を行い結果を返す
  59.         用法    optionset( argc, *argv[] );
  60.         引数    int        argc
  61.                 char    *argv[]
  62.         戻り値     int        0    正常終了
  63.                         -1    オプションの指定が正しくない
  64. ************************************************************/
  65.  
  66. int optionset( int argc, char *argv[] ){
  67.  
  68.     int        count;
  69.     char    c;
  70.     ret=0;
  71.  
  72.     strcpy(sccext,"SCC");
  73.     strcpy(srsext,"SRS");
  74.     rshift=2;
  75.     gshift=2;
  76.     bshift=4;    
  77.     ret = 0;
  78.     findflag=0;
  79.     /* オプション パラメータ 解析 */
  80.     if ( argc == 1 ) {
  81.         ret=-1;
  82.     } 
  83.     else{
  84.         for ( count = 1; count < argc; count++ ){
  85.             c = *argv[count];                        /* 先頭文字 get */
  86.             if ( c == '/' || c == '-' ){
  87.                 c = *(argv[count] + 1);                /* 2 文字目 get */
  88.                 switch ( c ){
  89.                     case 'h':
  90.                     case 'H':
  91.                     case '?':
  92.                         ret = -1;
  93.                         break;
  94.  
  95.                     case 'r':
  96.                     case 'R':
  97.                         rshift = *(argv[count] + 2);
  98.                         rshift -= 0x30; 
  99.                         break;
  100.  
  101.                     case 'g':
  102.                     case 'G':
  103.                         gshift = *(argv[count] + 2);
  104.                         gshift-=0x30;
  105.                         break;
  106.  
  107.                     case 'b':
  108.                     case 'B':
  109.                         bshift = *(argv[count] + 2);
  110.                         bshift-=0x30;
  111.                         break;
  112.  
  113.                       /* 無効 パラメータ */
  114.                     default:
  115.                     ret = -1;
  116.                 }        /* <switch> */
  117.             }
  118.             else{
  119.                    strcpy(fname, argv[count] );
  120.              }
  121.         }    /* <for> */
  122.       }
  123.     if(ret==-1){
  124.         printf("****************************************************\n");
  125.         printf("   MSX SCREEN12 BSAVE FILE -> SCREEN8 BSAVE FILE\n");
  126.         printf("        by ちにゃと    (NIFTY-Serve ID:GFH01000)\n");
  127.         printf("            1993/12/07       Ver 2.1 L20        \n");
  128.         printf("****************************************************\n");
  129.         printf("\n");
  130.         printf("用法) RUN386  SCC2SC8.EXP [-Rx] [-Gx] [-Bx] FILENAME\n");
  131.         printf("\n");
  132.         printf("-Rx -Gx -Bx   RGBの強さを調整  x=0,1,2,3,4 \n");
  133.         printf("              省略時は -R2 -G2 -B4\n");
  134.         printf("              (B のみ他の 2倍で指定)\n");
  135.         printf("\n");
  136.         printf("FILENAME      拡張子が .SCC .SRS  のみ\n");
  137.         printf("              ワイルドカ-ドも指定可能\n");
  138.         printf("\n");
  139.         printf("ex1)  RUN386 SCC2SC8.EXP SAMPLE.SCC\n");
  140.         printf("ex2)  RUN386 SCC2SC8.EXP A:*.SCC\n");
  141.         printf("ex3)  RUN386 SCC2SC8.EXP A:\\SCC\\SAMPLE*.SCC\n");
  142.         printf("\n");
  143.         printf("\n");
  144.         printf("\n");
  145.         return(-1);
  146.     }
  147.     namelen=strlen(fname);
  148.     flong=namelen;
  149.     for ( i =namelen-1; (i+1)>0 ;i-- ){
  150.         fname[i]=toupper(fname[i]);
  151.     }
  152.     for ( i =namelen-1; (i+1)>0 ;i-- ){
  153.         if ( fname[i] != 0x5c ){
  154.             flong -= 1;
  155.         }
  156.         else {
  157.             findflag=1;
  158.             break;
  159.         }
  160.     }
  161.     if(findflag==0){
  162.         flong=1;
  163.         for ( i = 0; i <255 ;i ++ ){
  164.             if ( fname[i] != 0x3a ){
  165.                 flong += 1;
  166.             }
  167.             else {
  168.                 findflag=2;
  169.                 break;
  170.             }
  171.         }
  172.     }
  173.     if(findflag!=0){
  174.         strncpy( filepath,fname,flong );
  175.     }
  176.     flong =strlen(fname);
  177.     for (i=0;i<3;i++){
  178.         if(fname[flong-3+i]!=sccext[i]&&fname[flong-3+i]!=(sccext[i]+0x20)&&
  179.            fname[flong-3+i]!=srsext[i]&&fname[flong-3+i]!=(srsext[i]+0x20) )
  180.         {
  181.             printf("拡張子が .SCC でも .SRS でもありません。\n");
  182.             return(-1);
  183.         }
  184.     }
  185.     return ret;
  186. }
  187. /************************************************************
  188.  
  189.                         sccload
  190.  
  191. ************************************************************/
  192. int sccload()
  193.  
  194. {
  195. char fname2[256];
  196.  
  197. strcpy(fname2,fname);
  198. printf("%s   ",fname);
  199.  
  200.  
  201.     if (_access(fname2,0) !=0 ){
  202.         printf("no scc file");
  203.         return(-1);
  204.     }
  205.     else{
  206.         pan=_open(fname2,_O_BINARY | _O_RDWR );
  207.         if (pan== -1 ){
  208.             return(-1);
  209.         }
  210.         ret=_read(pan,scchead,7);
  211.         if (ret== -1){
  212.             _close(pan);
  213.             return(-1);
  214.         }
  215.         else{
  216.             if(scchead[0]!=0xfe){
  217.                 printf("BSAVE FORMATではありません。\n");
  218.                 _close(pan);
  219.                 return(-1);
  220.             }
  221.             sccsize=scchead[4]*256+scchead[3]+1;
  222.             for( ; ; ){
  223.                 ret = _read(pan,&sccdata[0][0],256*256);
  224.                 if (ret == -1 ){
  225.                     _close(pan);
  226.                     printf("読み込みエラ-が発生しました。\n");
  227.                     return(-1);
  228.                 }
  229.                 else{
  230.                     _close(pan);
  231.                     break;
  232.                 }
  233.             }
  234.         }
  235.     }
  236.     return(0);
  237. }
  238. /***************************************************************
  239. 【デ-タファイルを作成する】
  240.  
  241.         概要    
  242.         用法    sc8save();
  243.         引数    無し
  244. ***************************************************************/
  245.  
  246. int sc8save ( void )
  247. {
  248.     char fname2[256];
  249.     int        wsize;
  250.     flong = 0;
  251.  
  252.     for ( i = 0; i <251 ;i ++ ){
  253.         if ( fname[i] != 0x2e ){
  254.             flong += 1;
  255.         }
  256.         else {
  257.             break;
  258.         }
  259.     }
  260.     strncpy( fname2,fname,flong );
  261.     fname2[flong]=0x00;
  262.     strcat( fname2,".SC8");
  263.     fname2[flong+4]=0x00;
  264.  
  265.  
  266.  
  267.     if ( _access( fname2, 0 ) == 0 ) {
  268. /*        printf( " 同名のファイルがあります。上書きします。 " );
  269. */        ret = _unlink ( fname2 );
  270.     }
  271.     ret = 0;
  272.     pan = _open( fname2,_O_BINARY | _O_RDWR | _O_CREAT, _S_IREAD | _S_IWRITE );
  273.     if ( pan == -1) {
  274.         printf(" 書き込みのオ-プンに失敗しました。\n" );
  275.         ret = -1;
  276.     }
  277.     if ( ret == 0 ) {
  278.         wsize = _write( pan, &scchead[0], 7  );
  279.         if ( wsize == -1 || wsize != 7 ) {
  280.             printf(" ヘッダ書き込みに失敗しました。\n" );
  281.             _close( pan );
  282.             return(-1);
  283.         }
  284.         else{
  285.             wsize = _write( pan, &sc8data[0][0], sccsize  );
  286.             if ( wsize == -1 || wsize != ( sccsize ) ) {
  287.                 printf(" デ-タ書き込みに失敗しました。\n" );
  288.                 _close( pan );
  289.                 return(-1);
  290.             }
  291.             else{
  292.                 printf("\n");
  293.             }
  294.         }
  295.     }
  296.     return (0);
  297. }
  298.  
  299.  
  300. /*********************************************************
  301.  
  302.                           convert
  303.                           
  304. *********************************************************/
  305. int convert(){
  306.     x=0;
  307.     for(i=0;i<sccsize/4;i++){
  308.         y[0]=sccdata[i][0] / 8;
  309.         y[1]=sccdata[i][1] / 8;
  310.         y[2]=sccdata[i][2] / 8;
  311.         y[3]=sccdata[i][3] / 8;
  312.         k = ( sccdata[i][0] & 7 )+ (sccdata[i][1] & 3 )*8;
  313.         kj= ( sccdata[i][2] & 7 )+ (sccdata[i][3] & 3 )*8;
  314. /*        if(x==256*127){
  315.         printf("y0=%3d y1=%3d y2=%3d y3=%3d k=%3d j=%3d\n"
  316.                 ,y[0],y[1],y[2],y[3],k,kj);
  317.         }
  318. */        for(j=0;j<4;j++){
  319.             bb[j]=y[j];
  320.             r[j]=y[j];
  321.             g[j]=y[j];
  322.             b[j]=y[j];
  323.             if((sccdata[i][1] & 4 )==0){
  324.                 g[j]+=k;
  325.                 bb[j]-=k;
  326.             }
  327.             else{
  328.                 if(g[j]>=(32-k) ){
  329.                     g[j]-=(32-k);
  330.                 }
  331.                 else{
  332.                     g[j]=0;
  333.                 }
  334.                 bb[j]+=(32-k);
  335.             }
  336.             if((sccdata[i][3] & 4 )==0){
  337.                 r[j]+=kj;
  338.                 bb[j]-=(kj*2);
  339.             }
  340.             else{
  341.                 if(r[j]>=(32-kj)){
  342.                     r[j]-=(32-kj);
  343.                 }
  344.                 else{
  345.                     r[j]=0;
  346.                 }
  347.                 bb[j]+=((32-kj)*2);
  348.             }
  349. /*            if(x==256*127){
  350.             printf("r=%3d g=%3d b=%3d bb=%3d   ",r[j],g[j],b[j],bb[j]);
  351.             }
  352. */            if( bb[j] >= 0 ){
  353.                 b[j]+=(bb[j]/4);
  354.             }
  355.             else{
  356.                 if( b[j] > (-1)*((bb[j]+2)/4) ){
  357. /*                if(x==256*127){printf("root2\n");}
  358. */                    b[j]+=(bb[j]/4);
  359.                 }
  360.                 else{
  361. /*                if(x==256*127){printf("root3\n");}
  362. */                    b[j]=0;
  363.                 }
  364.             }
  365. /*            if(x==256*127){
  366.                 printf("r=%3d g=%3d b=%3d bb=%3d\n",r[j],g[j],b[j],bb[j]);
  367.             }
  368. */            if (r[j]>31){
  369.                 r[j]=31;
  370.             }
  371.             if (g[j]>31){
  372.                 g[j]=31;
  373.             }
  374.             if (b[j]>31){
  375.                 b[j]=31;
  376.             }
  377.             r[j]=(r[j]+rshift)/4;
  378.             g[j]=(g[j]+gshift)/4;
  379.             b[j]=(b[j]+bshift)/8;    
  380.             if ((r[j] & 0x80)!=0){
  381.                 r[j]=0;
  382.             }
  383.             if ((g[j] & 0x80)!=0){
  384.                 g[j]=0;
  385.             }
  386.             if ((b[j] & 0x80)!=0){
  387.                 b[j]=0;
  388.             }
  389.             if (r[j]>7){
  390.                 r[j]=7;
  391.             }
  392.             if (g[j]>7){
  393.                 g[j]=7;
  394.             }
  395.             if (b[j]>3){
  396.                 b[j]=3;
  397.             }
  398. /*            if(x==256*127){
  399.                 printf("r=%3d g=%3d b=%3d bb=%3d\n",r[j],g[j],b[j],bb[j]);
  400.             }
  401. */            sc8tmp=(g[j]*32+r[j]*4+b[j]) % 256;
  402.             sc8data[i][j]=sc8tmp;
  403.         }
  404.         x+=4;
  405.     }
  406.     return(0);
  407. }
  408.  
  409. /*********************************************************
  410.  
  411.                           メイン
  412.  
  413. *********************************************************/
  414.  
  415.  
  416. void main( int argc, char *argv[] ){
  417.     fileno=0;
  418.     mode=0x16;
  419.     if(optionset( argc, argv )!=0){
  420.         exit(-1);
  421.     }
  422.     for ( i = 0; i <251 ;i ++ ){
  423.         if ( fname[i] != 0x2a ){
  424.             flong += 1;
  425.         }
  426.         else {
  427.             wildcard=1;
  428.             break;
  429.         }
  430.     }
  431.     if(wildcard==1){
  432.         w_ret=_dos_findfirst((char*)fname,mode,&wildfbuf);
  433.         if(w_ret){
  434.             printf("指定のワイルドカ-ドが見つかりません\n");
  435.             exit(-1);
  436.         }
  437.         else{
  438.             strcpy(wildfname[fileno],wildfbuf.name);
  439.             fileno++;
  440.             for (;;){
  441.                 w_ret=_dos_findnext(&wildfbuf);
  442.                 if(w_ret){
  443.                     break;
  444.                 }
  445.                 strcpy(wildfname[fileno],wildfbuf.name);
  446.                 fileno++;
  447.             }
  448.         }
  449.         for(wildct=0;wildct<fileno;wildct++){
  450.             strcpy(fname,filepath);
  451.             strcat(fname,wildfname[wildct]);
  452.              if(sccload()!=0){
  453.                 exit(-1);
  454.             }
  455.             if(convert()!=0){
  456.                 exit(-1);
  457.             }
  458.             strcpy(fname,wildfname[wildct]);
  459.             if(sc8save()!=0){
  460.                 exit(-1);
  461.             }
  462.         }
  463.     }
  464.     else{
  465.         if(sccload()!=0){
  466.             exit(-1);
  467.         }
  468.         if(convert()!=0){
  469.             exit(-1);
  470.         }
  471.         findflag=0;
  472.         namelen=strlen(fname);
  473.         flong=namelen;
  474.         for ( i =namelen-1; (i+1)>0 ;i-- ){
  475.             if ( fname[i] != 0x5c ){
  476.                 flong -= 1;
  477.             }
  478.             else {
  479.                 findflag=1;
  480.                 break;
  481.             }
  482.         }
  483.         if(findflag==0){
  484.             flong=1;
  485.             for ( i = 0; i <255 ;i ++ ){
  486.                 if ( fname[i] != 0x3a ){
  487.                     flong += 1;
  488.                 }
  489.                 else {
  490.                     findflag=2;
  491.                     break;
  492.                 }
  493.             }
  494.         }
  495.         if(findflag!=0){
  496.             for(i=flong;i<namelen;i++){
  497.                 fname[i-flong]=fname[i];
  498.             }
  499.             fname[i-flong]=0;
  500.         }
  501.         if(sc8save()!=0){
  502.             exit(-1);
  503.         }
  504.     }
  505.     exit(0);
  506. }
  507.